package main

//类型相同和类型赋值
//
//type Map map[string]string
//
//func (m Map) Print() {
//	for _, v := range m {
//		fmt.Println(v)
//	}
//}
//
//type iMap Map
//
////只要底层类型是slice、map等支持range的类型字面量，新类型仍然可以使用range迭代
//
//func (m iMap) Print() {
//	for k, v := range m {
//		fmt.Println(k, v)
//	}
//}
//
//type slice []int
//
//func (s slice) Print() {
//	for k, v := range s {
//		fmt.Println(k, v)
//	}
//}
//
//func main() {
//	mp := make(map[string]string, 10)
//	mp["hi"] = "tata"
//
//	//mp 与 ma有相同的底层 map[string]string，并且 mp 是未命名类型
//	//所以 mp 可以直接赋值给 ma
//	var ma Map = mp
//
//	ma.Print()
//
//	//im 与 ma 虽然有相同的底层类型 map[string]string，但它们中没有一个是未命名类型，不能赋值，如下语句不能通过编译
//	//var im iMap = ma
//	var im iMap = mp
//
//	im.Print()
//
//	//Maps实现了 Print() 方法，可以赋值给接口类型变量
//	var i interface {
//		Print()
//	} = ma
//
//	i.Print()
//
//	s1 := []int{1, 5, 3}
//	//sa := [3]int{1, 2, 3}
//	//ss := make([]int, 10)
//
//	//fmt.Printf("%T\n", s1)
//	//fmt.Printf("%T\n", ss)
//	//fmt.Printf("%T\n", sa)
//
//	var s2 slice = s1
//	//s1.Print() //非法
//	s2.Print()
//
//}
